iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
AI/ ML & Data

使用 jq 處理資料系列 第 26

Day26: 提取函式,善用 debug

  • 分享至 

  • xImage
  •  

昨天我們知道了,當 jq 處理資料的主程式寫的愈來愈多,流程比較複雜的時候,除了寫成一長串的字串表達式,我們還可以將 jq 主程式獨立寫在 .jq 檔案裡面;並且在 .jq 檔案裡面,我們可以透過 "vscode" IDE + 安裝 "jq Syntax Highlighting" 這個擴充套件,在更容易開發的環境下寫 jq 主程式。今天我們更進一步,繼續提取函式吧。

提取顯示蒲福風級函式

顯示蒲福風級的表達式是 ((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level),但要提取函式,我們會需要知道這個表達式所在的位置有怎樣的輸入。

我們在 Day24: 認識 generator 概念,有提到"逐筆 AnalysisData 的整理",其中 "要顯示的資料內容" 如下:

  [
    .fixTime[0:13], 
    separate(.coordinate)[0], 
    separate(.coordinate)[1], 
    .pressure, 
    ((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level), 
    ((.maxGustSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level), 
    $direction[.movingDirection], 
    .movingPrediction[0].value
  ]

還記得 generator 的概念是一個產生多個輸出的過濾器。所以 generator , 連接的字串,都是來自同一個輸入,也就是組這段字串陣列前的 | 前面的表達式 "山陀兒路徑資料中的最近五筆 AnalysisData"。

❗如果在這個時候,忘記了 "山陀兒路徑資料中的最近五筆 AnalysisData" 是長怎樣,會怎麼做呢?
💡前面有使用 generator .[] 逐一取得AnalysisData,所以可以用 keys 看看物件有哪些內容
❗可是前後的表達式都寫好了,這時候要怎麼使用 keys ,而盡量不用動到已經寫好的程式呢?
💡jq 有內建 debug 函式可以使用 🎉

debug 函式

debug 函式不帶參數,會直接用["DEBUG", ...] 的形式於終端機印出其 | 前的輸出內容;debug(filter) 帶參數則會輸出套用 filter 到其 | 前的輸出的內容喔。因此我們可以在 main.jq加入debug(keys) 來看看 "山陀兒路徑資料中的最近五筆 AnalysisData" 是長怎樣,如下

.analysisData.fix[-5:][] | debug(keys) |
 [
   (略),
   ((.maxWindSpeed|tonumber) as $speed|$wind[]|select($speed>=.min and $speed<.max)|.level), 
   (略)
 ]

如此一來,能在(盡量)不改變我們原有的程式碼的狀況下,查看忘記了的內容。

https://ithelp.ithome.com.tw/upload/images/20241010/200783891aaQ8YsKab.png

❗確認想看的資料看完之後, 記得移除 debug 。

提取顯示蒲福風級函式(續)

目前看來,雖然這個位置拿得到變數 $wind,但輸入的 analysisData 不包含變數 $wind。因此提取蒲福風級的函式,函式除了第一個參數,欄位.maxWindSpeed.maxGustSpeed通用,也要有第二參數 $wind,才能滿足原本表達式。所以我們整理函式如下:

def beaufort(f; wind_array):
  (f|tonumber) as $speed |
  wind_array[] |
  select($speed>=.min and $speed<.max)|
  .level;

提取完的函式先放在 main.jq 的上方,可以參考程式碼

結論

今天我們一步步的提取顯示蒲福風級函式,並且在過程中認識了內建的 debug 函式。 debug 函式能在不影響原本程式碼的情況下,只要安排它在你想查看輸入/輸出的位置,就可以檢視處理的資料在過程中的樣子,很實用喔!

感謝自己,今天也很認真學習 😊


上一篇
Day25: 將主程式寫在 main.jq 檔案中
下一篇
Day27: jq module
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言